package Servlet;

import Service.UserService;
import org.json.JSONException;
import org.json.JSONObject;
import utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.sql.Connection;
import java.util.Map;

/**
 * @Author Su
 * @Date 2025/4/30 10:29
 * @Version 1.0 （版本号）
 */
// RegisterServlet.java
@WebServlet("/api/register")
public class RegisterServlet extends HttpServlet {
    private UserService userService;// 业务逻辑层对象，用于处理用户注册

    @Override
    public void init() throws ServletException {// Servlet初始化方法，仅执行一次
        super.init();// 调用父类初始化逻辑
        // su获取数据库连接 (连接池)
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");// 加载MySQL驱动
            Connection connection = DBUtil.getConnection();//获取数据库连接（实际项目用连接池）
            this.userService = new UserService(connection);// 初始化UserService并传入连接
        } catch (Exception e) {
            throw new ServletException("初始化数据库连接失败", e);// 抛出异常，终止Servlet启动
        }
    }

    @Override    //doPost 方法用于处理 HTTP POST 请求
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应内容类型
        request.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");// 响应体为JSON格式
        response.setCharacterEncoding("UTF-8");  // 解决中文乱码

        // 创建JSON返回对象
        JSONObject responseJson = new JSONObject();

        try {
            // 从请求中获取JSON数据
            BufferedReader reader = request.getReader();// 获取请求体字符流
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) { // 逐行读取
                sb.append(line);
            }

            JSONObject jsonObject = new JSONObject(sb.toString()); // 解析JSON请求体

            //参数提取与验证
            String username = jsonObject.getString("username");
            String password = jsonObject.getString("password");
            String email = jsonObject.getString("email");
            String type = jsonObject.getString("type"); // 用户类型
            String emailCode = jsonObject.getString("emailCode");// 邮箱验证码

            // 验证输入             //去掉用户名前后的空格（比如用户不小心输入了空格 trim() 是 Java 中用来​​去掉字符串开头和结尾的空格​​的方法
            if (username == null || username.trim().isEmpty() ||// 非空校验 全面
                    password == null || password.trim().isEmpty() ||
                    email == null || email.trim().isEmpty() ||
                    emailCode == null || emailCode.trim().isEmpty()) {

                responseJson.put("code", 400); // 业务状态码
                responseJson.put("message", "所有字段都必须填写");// 错误信息
                response.setStatus(HttpServletResponse.SC_BAD_REQUEST);// HTTP 400状态码
            } else {
                // 调用服务层注册用户
                Map<String, Object> serviceResult = userService.registerUser(username, password, email, emailCode,type);

                if ((boolean) serviceResult.get("success")) {
                    responseJson.put("code", 200);
                    responseJson.put("message", "注册成功");
                    responseJson.put("data", serviceResult.get("user"));// 返回用户数据
                    response.setStatus(HttpServletResponse.SC_OK);
                } else {// 注册失败
                    responseJson.put("code", 400);
                    responseJson.put("message", serviceResult.get("message")); // 业务层错误信息
                    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                }
            }
        } catch (JSONException e) {
            responseJson.put("code", 400);
            responseJson.put("message", "请求参数格式错误");
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } catch (Exception e) {
            e.printStackTrace();
            responseJson.put("code", 500);
            responseJson.put("message", "服务器内部错误");
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        } finally {
            response.getWriter().print(responseJson.toString());
        }

    }

    @Override
    public void destroy() {//destroy是serlet生命周期结束时容器调用的方法，适合释放初始化时创建的长期资源
        // 关闭数据库连接 (连接池，不需要手动关闭连接)
        // 这里简化处理，实际应该确保所有连接都正确关闭
    }
}